package com.test.singleton.test4;

/**
 * @Author: junwe
 * @Date: 2020/12/6 21:15
 */
public class SingletonTest4 {
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Thread(new GetInstanceThread()).start();
        }
    }
}

/**
 * 懒汉式-同步方法
 */
class Singleton {

    /**
     * 私有化构造器，外部类不能new对象
     */
    private Singleton() {
    }

    private static Singleton INSTANCE;

    /**
     * 提供一个公有的静态方法返回对象实例
     * 当使用到该方法时才创建实例
     * 加入同步代码块，不能解决线程安全问题
     *
     * @return
     */
    public static Singleton getInstance() {
        if (INSTANCE == null) {
            synchronized (Singleton.class) {
                INSTANCE = new Singleton();
            }
        }
        System.out.println(INSTANCE.hashCode());
        return INSTANCE;
    }
}

class GetInstanceThread implements Runnable {

    @Override
    public void run() {
        Singleton.getInstance();
    }
}
